<%@ page import="entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %><%--
  Created by IntelliJ IDEA.
  User: teacher
  Date: 2022/4/13
  Time: 16:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
<%
    // 此处模拟存放作用域数据
    pageContext.setAttribute("msg","Hello pageContext");
    request.setAttribute("msg","Hello request");
    session.setAttribute("msg","Hello session");
    application.setAttribute("msg","Hello application");

    User user = new User(1,"admin","123456","13812345678","江苏-南京");
    User user2 = new User(2,"alice","123456","13812345678","江苏-南京");
    request.setAttribute("user",user);
    List<User> users = new ArrayList<User>();
    users.add(user);
    users.add(user2);
    request.setAttribute("users",users);
    Map<String,User> map = new HashMap<String,User>();
    map.put("u1",user);
    map.put("1u2",user2);
    request.setAttribute("map",map);
%>
<h1>通过EL表达式来实现</h1>
<!--
    获取作用域的数据,存在两种方式
    1.直接通过${key}的方式进行获取
        此时会自动搜索四大作用域的数据
        根据优先级（范围越小,优先级越高）
        依次在pageContext、request、session、application
        四个作用域中查询对应key的数据
        如果在某个作用域中找到了数据,则直接返回,不再继续查询
        如果在四个作用域中均未找到,不会返回null,而是什么都不返回
-->
msg:${msg}<br/>
<!--
    2.可以通过${作用域范围.key}获取对应作用域的数据
        作用域范围属于EL表达式的隐式对象（内置对象）
        在EL表达式中存在11个隐式对象
-->
pageContext:${pageScope.msg}<br/>
request:${requestScope.msg}<br/>
session:${sessionScope.msg}<br/>
application:${applicationScope.msg}<br/>
username:${param.username}<br/>
<h1>获取应用名</h1>
应用名:
<%
    HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
    String path = req.getContextPath();
    out.print(path);
    // ((HttpServletRequest) pageContext.getRequest()).getContextPath();
%><br/>
<!--
    在EL表达式中可以通过${对象.方法名}进行预定义方法的获取
    在调用方法时,遇到getxxx/setxxx方法的时候,可以省略get/set,方法首字母小写
    例如:pageContext.getRequest()在EL表达式中可以通过${pageContext.request}表示
-->
应用名:${pageContext.request.contextPath}<br/>
<h1>访问对象信息</h1>
<!--
    可以通过${key}获取到对应的对象
    也可以通过${key.属性名}获取到对象对应的属性
-->
${user.id}--${user.username}--${user.password}--${user.phone}--${user.address}
<h1>访问List集合</h1>
<!--
    访问该集合,可以通过${key[索引号]}获取集合中对应索引的元素
-->
${users[0].id}-${users[0].username}<br/>
${users[1].id}-${users[1].username}<br/>
<h1>访问Map集合</h1>
<!--
    Map集合是一个键值对类型
    因此,通过${key.键}表示获取对应的值(键不能以数字开头)
    也可以通过${key["键"]}表示获取对应的值(键可以以数字开头,但是不符合编码规范)
    编码规范中变量名不能以数字开头
-->
${map.u1.id}--${map["1u2"].username}<br/>
<h1>运算</h1>
<!--
    支持所有的Java运算
    语法效果类似于JS
    多个条件通过and或者or连接
-->
${3+2}<br/>
${3-2}<br/>
${3*2}<br/>
${3/2}<br/>
${3%2}<br/>
${3>2}<br/>
${2=="2"}<br/>
${empty user}<br/>
${empty user2}<br/>
${3>2 and 2>3}<br/>
${3>2 or 2>3}<br/>
${user.id == 1 ? "checked" : ""}<br/>

<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</body>
</html>
